package com.iamteer.day22;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

/**
主要回顾：对象输入输出流

对象输出流：ObjectOutputStream
	如果对象需要被写出到文件上，则对象必须实现 Serializable 接口（一个标志接口）
	
对象输入流：ObjectInputStream
	对象反序列化不会调用构造方法
	
	1. serialVersionUID 是用于记录 class 文件的版本信息（通过类名、成员、包名、工程名计算）
	2. 使用 ObjectInputStream 反序列化时，ObjectInputStream 会先读取 serialVersionUID，然后与本地的 class 文件
	的 serialVersionUID 进行比较，如果不一致，则反序列化失败
	3. 如果类成员可能会修改，则最好给类指定一个 serialVersionUID，以使 JVM 不再自动计算 serialVersionUID
	4. 如果对象某个成员不想被序列化到硬盘上，可以使用关键字 transient 修饰
	5. 如果一个类维护了另外一个类的引用，则另外一个类也需要实现 Serializable 接口
 */

class User implements Serializable{
	private static final long serialVersionUID = 1L;
	String username;
	String password;
//	int age;
	transient int age;
	public User(String username, String password) {
		super();
		this.username = username;
		this.password = password;
//		System.out.println("User Constructor...");	//对象反序列化不会调用构造方法（对象克隆也不会）
	}
	
	@Override
	public String toString() {
		return "{" + this.username + "\t" + this.password + "}";
	}
}


public class ObjectStream {

	public static void main(String[] args) throws IOException, ClassNotFoundException {
//		objectWrite();
		objectRead();
	}

	//对象的反序列化
	public static void objectRead() throws IOException, ClassNotFoundException {
		FileInputStream in = new FileInputStream("user.txt");
		ObjectInputStream inputStream = new ObjectInputStream(in);
		User user = (User) inputStream.readObject();
		inputStream.close();
		System.out.println(user);
	}
	
	//对象序列化
	public static void objectWrite() throws IOException {
		User user = new User("test", "123");
		FileOutputStream out = new FileOutputStream("user.txt");
		ObjectOutputStream objectOutputStream = new ObjectOutputStream(out);
		objectOutputStream.writeObject(user);
		objectOutputStream.close();
	}
	
}
